package clients;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Map.Entry;

import barsbieres.Bar;
import barsbieres.Biere;
import barsbieres.Fut;
import commandes.Commande;
import files.SaveCmdClient;

public abstract class Client {

	//Attributs
	private Bar bar;
	protected ArrayList<Biere> bieresPreferees; 
	// private Double compte;
	protected String nomC;
	private static final int TAUX_ALCOOLISME = 15;
	private int alcoolisme;

	//Constructeurs
	public Client() {
		this.alcoolisme = new Random().nextInt(TAUX_ALCOOLISME) + 1;
		this.bieresPreferees = new ArrayList<Biere>();
	}

	public abstract void choisitBar(ArrayList<Bar> listeBars);

	public abstract void satisfaction(Bar b, boolean satisfait);

	/**
	 * Chaque client Commande sa bi�re pr�f�r�e, puis sa deuxi�me, tant que 1e
	 * bar qu'il a choisi n'a pas la bi�re avec la quantit� demand�e en stock.
	 * 
	 * Si le bar peut satisfaire 1a commande, l'argent est d�bit� du Compte du
	 * client au moment de la Commande.
	 * 
	 * Lorsque le bar ne peut pas r�pondre � la demande, le client peut noter
	 * cette information pour choisir son bar la semaine suivante.
	 * 
	 * Chaque client a un certain niveau d�alcool�sme : ce degr� d�termine la
	 * quantit� de bi�re qu'il va commander dans la semaine.
	 */

	/** Effectue une commande dans le bar choisi ( tente de commander toutes
	 * ses bi�res pr�f�r�es jusqu'� ce que le bar soit capable d'y r�pondre)
	 * @return boolean
	 */
	public boolean commande() {

		for(int i = 0; i < bieresPreferees.size(); i++){

			Biere biere = bieresPreferees.get(i);
			Commande comde = new Commande(biere, alcoolisme);
			//if(alcoolisme > biere.getTirage()){
			if(commande(comde)){
				//System.out.println(bar.getGerant().getNom());
				System.out.println("Commande servie");
				satisfaction(bar, true);
				bar.getGerant().commandeServie(comde);
				//i = bieresPreferees.size();
				//alcoolisme -= biere.getTirage();
				return true;
			}
			//}
		}
		System.out.println("Commande non servie");
		
		satisfaction(bar, false);
		return false;
	}

	/** Commande une qte de la marque donn�e au bar choisi */
	public boolean commande(Commande comde) {
		if(bar.getMapFut().containsKey(comde.getBiere())){
			for(Fut fut : bar.getMapFut().get(comde.getBiere()))
				if(fut.getContenu() >= comde.getQuantite()){
					return true;
				}
		}
		return false;
	}

	// public Double getCompte() {
	// return compte;
	// }
	//
	// public void setCompte(Double compte) {
	// this.compte = compte;
	// }

	public String getNomC(){
		return nomC;
	}

	public void setNom(String nom){
		this.nomC = nom;
	}

	public int getAlcoolisme() {
		return alcoolisme;
	}

	public Bar getBar() {
		return this.bar;
	}

	//Setteur pour changer de bar.
	public void setBar(Bar bar) {
		this.bar = bar;
	}

	// Genere une liste preference de bieres
	public ArrayList<Biere> bieresPreferees(ArrayList<Biere> listeBieres){
		ArrayList<Biere> listeBierePreferees = new ArrayList<Biere>();

		boolean [] tire = new boolean [listeBieres.size()];
		int i = 0;

		while( i < listeBieres.size()){
			int r = new Random().nextInt(listeBieres.size());
			if(!tire[r]){
				listeBierePreferees.add(listeBieres.get(r));
				tire[r] = true;
				i++;
			}
		}

		return listeBierePreferees;
	}

	public String afficherListeBieresPreferees(){
		String res = bieresPreferees.get(0).getNom();

		for(int i = 1; i < bieresPreferees.size(); i++){
			res += " | " + bieresPreferees.get(i).getNom();
		}

		return res;


	}

}
